package hoja3;
/*66666666666666666666666666666666666666666666666666666666666666666
 * 					ImplementacionHashMap
 * 
 * Escrito por: Ernesto Rodriguez
 * 
 * Descripcion: Clase de implementacion de una lista mediante
 * mapas.
 66666666666666666666666666666666666666666666666666666666666666666*/

import java.util.HashMap;


public class ImplementacionHashMap <Type> implements Lista <Type>{

	HashMap <Type, Type> cosas;
	int curr = 0;
	
	/**Inicializa una lista vacia.
	 */
	public ImplementacionHashMap(){
		
		cosas = new HashMap<Type, Type>();
		cosas.put(null, null);
	}

	public void add(Type obj, int pos) {
		
		if (pos == 0){
			
			cosas.put(obj, cosas.get(null));
			cosas.put(null, obj);
			return;
		}
		
		if (pos>=cosas.size() && pos<=0)
			throw new NullPointerException();
		
		//Type curr = cosas.get(1);
		Type next = cosas.get(null);
		Type curr = next;
		
		for (int veces=0; veces<pos; veces++){
			curr=next;
			next = cosas.get(curr);
		}
		
		cosas.put(obj, cosas.get(curr));
		cosas.put(curr, obj);
		
	}

	public void add(Type obj) {
				
		if (cosas.size()==0){
			cosas.put(obj, null);
			cosas.put(null, obj);
		}
		else{
			
			Type curr;
			Type next = cosas.get(null);
			do{
				
				curr = next;
				next = cosas.get(curr);
				
			}while(next!=null);
			
			cosas.put(curr, (Type)obj);
			cosas.put(obj, null);
		}
			
	}

	public void delete(int pos) {
		
		Type curr;
		
		if (pos==0){
			
			curr = cosas.get(null);
			//Type next = cosas.get(curr);
			cosas.remove(null);
			cosas.put(null, cosas.get(curr));
			cosas.remove(curr);
			//cosas.remove(next);
			//cosas.remove(key)
			//cosas.remove(key);
			//System.out.println(cosas);
		}
		else if (pos<cosas.size()-1 && pos>=0){
			
			Type next = cosas.get(null);
			curr = cosas.get(null);
			//System.out.println("Size vale " + pos);
			
			for(int veces = 0; veces<pos; veces++){
				
				curr=next;
				next = cosas.get(curr);
			}
			
			cosas.remove(curr);
			cosas.put(curr, cosas.get(next));
			cosas.remove(next);
			//System.out.println(cosas);
			//System.out.println(curr);
			//System.out.println(next);
		}else{
			//System.out.println("geelawee");
			throw new NullPointerException();
			
		}
	}

	public Type get(int pos) {
		
		if (pos==0)
			return cosas.get(null);
		else if (pos<cosas.size()){
			
			Type curr = cosas.get(null);
			
			for (int veces=0; veces<pos; veces++)
				curr = cosas.get(curr);
			
			//System.out.println(curr);
			return curr;
		}else
			throw new NullPointerException();
			
	}

	
	public int size() {
		
		//return cosas.size();
		//System.out.println(cosas);
		return cosas.size()-1;
	}

	
	public Boolean hasNext() {
		
		if (get(curr)==null)
		return false;
		
		return true;
	}

	public Type next() {
		
		Type ret = get(curr);
		curr++;
		return ret;
	}

	public void reset() {
		
		curr=0;
	}

	public String toString(){
		
		return cosas.toString();
	}
	
}
